﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AgileSaude.Entities;
using AgileSaude.Data;
using AgileSaude.Data.Repository;
using FBS.Framework;
using AgileSaude.Business.Validation;

namespace AgileSaude.Business.Process
{
    internal class UsuarioProcess
    {
        private const string SenhaCaracteresValidos = "abcdefghijklmnopqrstuvwxyz1234567890@#!?";

        internal string CreatePassword(int tamanho)
        {
            int valormaximo = SenhaCaracteresValidos.Length;

            Random random = new Random(DateTime.Now.Millisecond);

            StringBuilder senha = new StringBuilder(tamanho);

            for (int indice = 0; indice < tamanho; indice++)
                senha.Append(SenhaCaracteresValidos[random.Next(0, valormaximo)]);
            
            return senha.ToString();
        }

        internal string GeraSenha(int tamanho)
        {
            string guid = Guid.NewGuid().ToString().Replace("-", "");

            Random clsRan = new Random();
            Int32 tamanhoSenha = clsRan.Next(tamanho, tamanho);

            string senha = "";
            for (Int32 i = 0; i <= tamanhoSenha; i++)
            {
                senha += guid.Substring(clsRan.Next(1, guid.Length), 1);
            }

            return senha;
        }
        
        internal Resultado Incluir(UsuarioEntities pUsr)
        {
            Resultado resultado = new Resultado();

            try
            {
                UsuarioValidation userValid = new UsuarioValidation(pUsr);
                resultado = userValid.ValidarUsuario();

                if (resultado.Sucesso)
                {
                    usuario user = new usuario();
                    Util.CopyPropertyValues(pUsr, user);

                    new usuarioRepository().Add(user);
                }
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Incluir", "UsuarioProcess");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado Alterar(UsuarioEntities pUsr)
        {
            Resultado resultado = new Resultado();
            usuarioRepository usuarioRepository = new usuarioRepository();

            try
            {
                usuario user = usuarioRepository.getusuario(Convert.ToInt32(pUsr.idUsuario));
                Util.CopyPropertyValues(pUsr, user);

                usuarioRepository.Update();
                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                Util.GravarLog(ex.Message, "AgileSaude");
                resultado.Sucesso = false;
                throw ex;
            }

            return resultado;
        }

        internal Resultado AutenticarLogin(ref UsuarioEntities pUsuario, string pSenha)
        {
            Resultado resultado = new Resultado();
            try
            {
                usuario userData = new usuarioRepository().getusuarioByCPF(pUsuario.CPF);

                if ((userData == null) || !((bool)userData.Ativo))
                {
                    Mensagem omensagem = new Mensagem();
                    omensagem.Descricoes.Add("CPF não encontrado ou inativo!");
                    resultado.Sucesso = false;
                    resultado.Mensagens.Add(omensagem);
                }
                else if (pSenha != new Criptografia("12345").Decodificar(userData.Senha))
                {
                    Mensagem omensagem = new Mensagem();
                    omensagem.Descricoes.Add("Senha inválida!");
                    resultado.Sucesso = false;
                    resultado.Mensagens.Add(omensagem);
                }
                else
                {
                    pUsuario = GetUsuario(userData);
                    resultado.Sucesso = true;
                }
                
                return resultado;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "AutenticarLogin", "UsuarioProcess");
                resultado.Sucesso = false;
                throw ex;
            }
        }

        internal Resultado TemAcesso(UsuarioEntities oUsuario, string NomePagina, ref Resultado resultado)
        {
            //foreach (PerfilEntities perfil in oUsuario.ListaPerfil)
            //{
            //    foreach (FuncionalidadesEntities funcionalidade in perfil.Funcionalidades)
            //    {
            //        string Func = funcionalidade.Caminho.Split('/')[funcionalidade.Caminho.Split('/').Length - 1];

            //        if (Func.ToUpper().Equals(NomePagina.ToUpper()))
            //        {
            //            resultado.Sucesso = true;
            //            break;
            //        }
            //    }
            //}

            if (!resultado.Sucesso)
            {
                String mensagem = "Você não tem permissão para acessar essa funcionalidade.";
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "TemAcesso", "UsuarioProcess");
                resultado.Sucesso = false;
            }
            return resultado;
        }

        internal UsuarioEntities GetUsuario(int pIdUsuario)
        {
            usuario userData = new usuarioRepository().getusuario(pIdUsuario);

            if (userData == null)
            {
                return new UsuarioEntities();
            }
            else
            {
                return GetUsuario(userData);
            }

        }

        internal UsuarioEntities GetUsuarioByCPF(string pCPF)
        {
            usuario userData = new usuarioRepository().getusuarioByCPF(pCPF);

            if (userData != null)
            {
                return GetUsuario(userData);
            }
            else
            {
                return null;
            }

        }

        private static UsuarioEntities GetUsuario(usuario userData)
        {
            UsuarioEntities userEntitie = new UsuarioEntities();

            Util.CopyPropertyValues(userData, userEntitie);

            return userEntitie;
        }

        internal List<UsuarioEntities> Listar(UsuarioEntities pFiltro, ref Resultado resultado)
        {
            List<UsuarioEntities> lista = new List<UsuarioEntities>();

            if (pFiltro == null)
            {
                pFiltro = new UsuarioEntities();
            }

            try
            {
                var usuario = from u in new usuarioRepository().GetAll()
                              where (string.IsNullOrEmpty(pFiltro.CPF) || u.CPF == pFiltro.CPF) &&
                               (string.IsNullOrEmpty(pFiltro.Nome) || u.Nome.ToUpper().Contains(pFiltro.Nome.ToUpper())) &&
                               (pFiltro.idUsuario == 0 || u.idUsuario == pFiltro.idUsuario) &&
                               (pFiltro.idPerfil == 0 || u.idPerfil == pFiltro.idPerfil)
                               select u;

                foreach (usuario user in usuario)
                {
                    lista.Add(GetUsuario(user));
                }

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                String mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "", "Listar", "UsuarioProcess");
                resultado.Sucesso = false;
            }

            return lista;
        }

        internal Resultado AtivarInativar(int pIdUsuario, bool pStatus)
        {
            Resultado resultado = new Resultado();
            String mensagem = String.Empty;

            try
            {
                usuarioRepository rep = new usuarioRepository();
                
                var usuario = rep.getusuario(pIdUsuario);

                usuario.Ativo = pStatus;
                rep.Update();

                mensagem = "Usuário " + (pStatus ? "ativado" : "inativado") + " com sucesso.";

                Mensagem omensagem = new Mensagem();
                omensagem.Descricoes.Add(mensagem);

                resultado.Sucesso = false;
                resultado.Mensagens.Add(omensagem);

                resultado.Sucesso = true;
            }
            catch (Exception ex)
            {
                mensagem = ex.Message;
                new ResultadoProcess().GravarLog(ref resultado, mensagem, "AgileSaude", "Status", "AtivarInativar", "UsuarioProcess");
                resultado.Sucesso = false;

            }

            return resultado;

        }

        internal void EnviarSenha(UsuarioEntities pObj)
        {
            try
            {
                UsuarioEntities user = new UsuarioFacade().GetUsuarioByCPF(pObj.CPF);
                if (user != null)
                {
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    sb.AppendLine(string.Format("Parabéns {0}! <br/>", user.Nome));
                    sb.AppendLine("Seu cadastro foi efetuado com sucesso <br/>");
                    sb.AppendLine(string.Format("Seu login de acesso é {0} <br/>", pObj.CPF));
                    sb.AppendLine(string.Format("Sua senha para acesso é {0} <br/>", new Criptografia("12345").Decodificar(pObj.Senha)));
                    sb.AppendLine("Agradecemos a preferência <br/>");
                    sb.AppendLine("www.agilesaude.com.br <br/>");

                    Mail email = new Mail();
                    email.CorpoHTML = sb.ToString();
                    email.AdicionarDestinatario(TipoDestinatario.Para, user.Email);
                    email.Assunto = "Agile Saúde - Dados de acesso";
                    email.EnableSsl = false;
                    email.De = new System.Net.Mail.MailAddress("contato@agilesaude.com.br");

                    email.Enviar();
                }
            }
            catch (Exception ex)
            { }
        }

    }
}

